/*
 *  Mistack.java
 * 
 * Clase que implementa al stack, se le crean cuerpo a los metodos segun el nombre para la funcion que realiza un stack
 * 
 *  Universidad del Valle de Guatemala            Algoritmos y Estructura de Datos 
 *  Seccion 20
 *  Hoja de trabajo 2
 */

/**
 *
 * @author Alejandro Rojas            Carne 10104
 */

import java.util.LinkedList;

/**
 * Implementa a la pila y sus metodos, el cuerpo creado para cada metodo simula segun el nombre lo que realiza ese metodo
 * en un stack.
 * @author Alejandro Rojas          Carne 10104
 * @param <E> Objeto generico para que la clase pueda ser implementada por cualquier objeto.
 */
public class Mistack2<E> extends Claseabstracta<E> {
    
    private LinkedList<E> lista;
    
    /**
     * Constructor del objeto de la clase Mistack, el cual inicializa el atributo vac, que indica si la pila esta vacia o no.
     * Se inicializa el apuntador de la lista y la lista en si es inicializa y preparada para recibir los objetos de la clase que 
     * implemente a Mistack2
     * @param obt  Este parametro indica a la pila que objetos tendra que recibir.
     */
    public Mistack2(E obt){
      vac = true;
      cp = 0;
      lista = new LinkedList<E>();
  
  }

     /**
     * Este metodo permite, por medio de parametro ingresar un objeto al stack, en la ultima posicion.
     * El elemento es agregado luego de la ultima casilla anterior al ser llamado este metodo.
     * @param element Se recibe como parametro un objeto de la misma clase con que se implemento la interfaz, para poderlo ingresar a la pila.
     */
    @Override
    public void push(E element ) {
        
        lista.add(element);
        cp = cp + 1;
    }
 /**
     * Metodo que permite obtener el objeto que se encuentra en la ultimo posicion y lo elimina de la pila al ser llamado
     * el metodo.
     *Luego de ser llamado este metodo el indice de la pila se disminuye en uno porque el ultimo elemento anterior fue eliminado.
     * @return Un objeto de la clase que se especifico en la implementacion de la pila, siendo este el de ultima posicion.
     */
    @Override
    public E pop() {
        E obt;
        obt = null ;
        if (cp != 0)
        {
            cp = cp - 1;
            obt = lista.get(cp);
            lista.remove(cp);
        }
        else
        {
        System.out.println("No hay elementos ");
        }
        
        return obt;
        
    }
 

   /**
     * Metodo que permite obtener el objeto que se encuentra en la ultima posicion sin eliminarlo de la pila.
     * Luego de ser llamado no genera cambios en la pila
     * @return Un objeto de la clase que se especifico en la implementacion de la pila, siendo este el de la ultima posicion.
     */
    @Override
    public E peek() {
        E elem;
        cp = cp - 1;
        elem = lista.get(cp);
        cp = cp + 1;
        return elem;
    }
    
    
    
}

